import Config from "../config.js";
import Upload from "./upload.js";

/**
 * var store = window.plus.storage.getItem(file.attachmentId);
 * window.plus.storage.setItem(attachmentId, decodeURI(d.filename));
 */
class ResourceLoader {
  constructor(fw) {
    this.$framework = fw;
    this.warning = null;
  }

  /**
   * 通过附件id加载资源
   * @param {*} resourceId 资源id，往往是附件id
   * @param {Boolean} ensure true表示如果不是wifi网络，将会提示是否使用流量下载
   * @param {Boolean} tip 是否提示下载进度
   */
  load(resourceId, ensure = false, tip = false) {
    return new Promise((resolve, reject) => {

      let url = Config.api.download + "?attachmentId=" + resourceId;

      if (!window.qmplus.isMobile()) {
        // 一般来说，调用resolve或reject以后，Promise 的使命就完成了，后继操作应该放到then方法里面，
        // 而不应该直接写在resolve或reject的后面。所以，最好在它们前面加上return语句，这样就不会有意外。
        // https://es6.ruanyifeng.com/#docs/promise
        // 不是手机端，直接返回网络路径
        return resolve(url);
      }

      let cachePath = window.qmplus.storage.getItem(resourceId);
      if (this.isValidFilepath(cachePath)) {
        return resolve(cachePath);
      }

      // 该资源未缓存，或者缓存的路径有问题，则重新下载下来并缓存
      this.$framework.$f7.request.promise.post('/api/base/fileupload/getFile', {
        attachmentId: resourceId
      }).then((rlt) => {
        rlt = JSON.parse(rlt.data);
        let file = rlt.parameters.file;
        if (ensure) {
          // 如果不是wifi，则提示下载
          return this.ensureDownload(file.fileSize).then((r) => {
            if (r) {
              return this.createDownload(resourceId, file.fileName, tip);
            }
            return false;
          });
        } else {
          // 不提示，直接下载
          return this.createDownload(resourceId, file.fileName, tip);
        }
      }).then((r) => {
        resolve(r ? r : url);
      });

    }).then((value) => {
      return value;
    });
  }

  // 是否是合法的文件名称
  isValidFilepath(filepath) {
    return (
      filepath != null &&
      filepath.length > 5 &&
      filepath.indexOf(".") > 0 &&
      filepath.indexOf("downFile") == -1 &&
      filepath.indexOf("login") == -1
    );
  }

  // 确认是否下载
  ensureDownload(size) {
    return new Promise((resolve, reject) => {
      if (!this.isWifi()) {
        this.$framework.$f7.dialog.confirm(
          "当前不在wifi模式下，继续将使用" +
          Math.ceil(size / 1024 / 1024) +
          "MB流量，是否继续？",
          r => {
            if (r) {
              resolve(true);
            } else {
              resolve(false);
            }
          }
        );
      } else {
        // wifi网络
        resolve(true);
      }
    });
  }
  // 创建下载任务，下载成功返回本地路径，下载失败返回false
  createDownload(attachmentId, filename, tip = false) {
    let self = this;
    return new Promise((resolve, reject) => {
      let url = Config.api.download + "?attachmentId=" + attachmentId;
      var dtask = window.qmplus.downloader.createDownload(
        url, {
          // 坑3：这里指定下载的文件路径（包括文件名），如果不指定，ios下载下来的可能是乱码的文件名
          filename: `${Config.api.cachePath}${filename}`
        },
        function (d, status) {
          // 下载完成
          if (status == 200 && self.isValidFilepath(d.filename)) {
            let fn = decodeURI(d.filename);
            // 存记录
            window.qmplus.storage.setItem(attachmentId, fn);

            resolve(fn);
          } else {
            self.$f7.dialog.toast("文件加载失败，异常状态: " + status);
            resolve(false);
          }
        }
      );
      dtask.addEventListener("statechanged", function (task, status) {
        if (tip) {
          switch (task.state) {
            case 1:
              self.showWarning("开始加载...");
              break;
            case 2:
              self.showWarning("链接到服务器...");
              break;
            case 3:
              self.showWarning(
                "加载中..." +
                Math.round((task.downloadedSize / task.totalSize) * 100) +
                "%"
              );
              break;
            case 4:
              self.showWarning("加载完成");
              break;
          }
        }
      });
      dtask.start();
    });
  }
  showWarning(message) {
    if (this.warning) {
      this.warning.setTitle(message);
    } else {
      this.warning = window.plus.nativeUI.showWaiting(message);
      this.warning.onclose = function () {
        this.warning = null;
      };
    }
  }
  isWifi() {
    return window.qmplus.networkinfo.getCurrentType() == window.qmplus.networkinfo.CONNECTION_WIFI;
  }
}

export default ResourceLoader;
